#pragma once

#include <functional>
#include "PtrHash.hpp"
#include "PtrDeepEqual.hpp"
#include "EndAwareIterator.hpp"


namespace terms {
	namespace util {
		/**
		 * \brief Deep compare the equality of two pointers.
		 **/
		template <typename Object, typename Equal=std::equal_to<Object>>
		class PtrDeepEqual {
		private:
			Equal _equal;

		public:
			bool
			operator()(const Object *o0, const Object *o1) const
			{
				return (o0 == o1) || _equal(*o0, *o1);
			}
		};
	}
}	
